/**
 * 
 */
package br.com.devschool.entity;

import java.io.Serializable;
import java.util.Date;
import java.util.Set;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.devschool.util.BaseEntity;
import br.com.devschool.util.EnumTurno;

/**
 * @author ATILLA
 *
 */

@Entity
@Table
public class Turma extends BaseEntity implements Serializable {

	private static final long serialVersionUID = 5059338210370455370L;

	private String 				codigo;
	private Date 				dataCadastro;
	private Date 				dataInicio;
	private Date 				dataFim;
	private EnumTurno 			turno;
	private Professor 			professor;
	private Curso				curso;
	private Set<Matricula>		matriculas;
	private Set<Calendario> 	calendarios;
	private Set<Certificado> 	certificados;
	
	public Turma(Integer id, String codigo, Date dataCadastro,
			Date dataInicio, Date dataFim, EnumTurno turno, 
			Professor professor, Curso curso, Set<Matricula> matriculas, 
			Set<Calendario> calendarios, Set<Certificado> certificados) {
		super(id);
		this.codigo 		= codigo;
		this.dataCadastro 	= dataCadastro;
		this.dataInicio 	= dataInicio;
		this.dataFim 		= dataFim;
		this.turno 			= turno;
		this.professor 		= professor;
		this.curso 			= curso;
		this.calendarios 	= calendarios;
		this.certificados 	= certificados;
		this.matriculas 	= matriculas;
	}
	
	public Turma() { }

	public String getCodigo() {
		return codigo;
	}

	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}

	@Column(name="data_cadastro")
	@Temporal(TemporalType.DATE)
	public Date getDataCadastro() {
		return dataCadastro;
	}

	public void setDataCadastro(Date dataCadastro) {
		this.dataCadastro = dataCadastro;
	}

	@Column(name="data_inicio")
	@Temporal(TemporalType.DATE)
	public Date getDataInicio() {
		return dataInicio;
	}

	public void setDataInicio(Date dataInicio) {
		this.dataInicio = dataInicio;
	}

	@Column(name="data_fim")
	@Temporal(TemporalType.DATE)
	public Date getDataFim() {
		return dataFim;
	}

	public void setDataFim(Date dataFim) {
		this.dataFim = dataFim;
	}

	@Enumerated
	@Column(name="enum_turno_key")
	public EnumTurno getTurno() {
		return turno;
	}

	public void setTurno(EnumTurno turno) {
		this.turno = turno;
	}

	@ManyToOne
	@JoinColumn(name="id_professor")
	public Professor getProfessor() {
		return professor;
	}

	public void setProfessor(Professor professor) {
		this.professor = professor;
	}

	@ManyToOne
	@JoinColumn(name="id_curso")
	public Curso getCurso() {
		return curso;
	}

	public void setCurso(Curso curso) {
		this.curso = curso;
	}

	@ManyToMany
	@JoinTable(name="matricula_has_turma", 
		joinColumns={ 
			@JoinColumn(name="id_turma") 
		}, 
		inverseJoinColumns={ 
			@JoinColumn(name="id_matricula") 
		}
	)
	public Set<Matricula> getMatriculas() {
		return matriculas;
	}

	public void setMatriculas(Set<Matricula> matriculas) {
		this.matriculas = matriculas;
	}

	@OneToMany(mappedBy="turma", fetch = FetchType.LAZY)
	public Set<Calendario> getCalendarios() {
		return calendarios;
	}

	public void setCalendarios(Set<Calendario> calendarios) {
		this.calendarios = calendarios;
	}

	@OneToMany(mappedBy="turma", fetch = FetchType.EAGER)
	public Set<Certificado> getCertificados() {
		return certificados;
	}

	public void setCertificados(Set<Certificado> certificados) {
		this.certificados = certificados;
	}
	
}
